package com.util.list;

import org.junit.Test;

import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class ListDemo {


    /**
     * 将数组转化为可变长度的list,
     * 使用基础类型的话，intList中添加的是int[]数组类型
     */
    @Test
    public void test02(){
        String[] strArray = {"111", "222"};
        ArrayList< String> arrayList = new ArrayList<String>(strArray.length);
        Collections.addAll(arrayList, strArray);
        System.out.println(arrayList);

        Integer[] integerArray = {1,2,3};
        ArrayList< Integer> integerList = new ArrayList(integerArray.length);
        Collections.addAll(integerList, integerArray);
        System.out.println(integerList);

        int[] intArray = {1,2,3};
        ArrayList intList = new ArrayList(intArray.length);
        //首先，各种collectioin容器的元素都只能是继承了Object类的对象，所以不能是8种基本类型。如果要放入基本类型，必需要用它们对应的包装器进行包装。
        Collections.addAll(intList, intArray);
        System.out.println(intList);
    }

    /**
     * List sort方法详解
     * java.util.List#sort(java.util.Comparator<? super E> c)
     * 这个方法定义了一个Comparator<? super E>的参数，Comparator的具体实现类，最好是这个list中E的父类
     * 这样这个Comparator对象可以被E的所有兄弟类使用。
     * 这个例子里面 AnimalComparator类具体实现为Animal这样，Animal所有的子类都可以使用这个比较器
     */
    @Test
    public void testSort(){

        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog("Maxlength"));
        dogs.add(new Dog("medium"));
        dogs.add(new Dog("min"));

        System.out.println(dogs);
        dogs.sort(new AnimalComparator());
        System.out.println(dogs);


        List<Cat> cats = new ArrayList<>();
        cats.add(new Cat("a"));
        cats.add(new Cat("ab"));
        cats.add(new Cat("abc"));

        System.out.println(cats);
        cats.sort(new AnimalComparator());
        System.out.println(cats);

    }
    class Animal{
        String name ;

        public Animal(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Animal{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    class Dog extends Animal{

        public Dog(String name) {
            super(name);
        }

        @Override
        public String toString() {
            return super.toString();
        }
    }
    class Cat extends Animal{

        public Cat(String name) {
            super(name);
        }

        @Override
        public String toString() {
            return super.toString();
        }
    }

    class AnimalComparator implements Comparator<Animal> {

        @Override
        public int compare(Animal o1, Animal o2) {
            return o1.name.length()-o2.name.length();
        }
    }
    //test  sort end


    /**
     *
     */
    @Test
    public void test01(){
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("g");
        list.add("h");
        Spliterator<String> spliterator = list.spliterator();
        Stream<String> stream = StreamSupport.stream(spliterator, true);
//        Stream<String> stream = StreamSupport.stream(spliterator, false);
        stream.forEach(s->System.out.println(s));
    }


    /**
     * 因为重载 ArrayList 数字类型remove时会出现bug
     * ArrayList 中有  E remove(int index) 和 boolean remove(Object o)  两个方法，remove(index)是删除具体位置的元素，remove(Object)是删除该对象，所以当ArrayList中元素为基础数据类型int是，会出现remove方法不明确。
     *
     向集合中添加 [-4,4]9个数字
     [-1, 0, -2, 1, -3, 2, -4, 3]
     [-4, -3, -2, -1, 0, 1, 2, 3]
     然后删除[0,4]这五个数字，但是实际调用List时，删除的是指定位置上的元素
     [-1, -2, -3, -4]
     [-3, -1, 1, 3]
     */
    @Test
    public void testRemove(){
        Set<Integer> set = new HashSet<>();
        List<Integer> list = new ArrayList<>();
        for (int i = -4; i < 4; i++) {
            set.add(i);
            list.add(i);
        }
        System.out.println(set);
        System.out.println(list);

        for (int i = 0; i < 4; i++) {
            set.remove(i);
            list.remove(i);
        }
        System.out.println(set);
        System.out.println(list);
    }

    public static void main(String[] args) {
        int a,b=0;

    }

}
